We used to handle zero height/width specially in the non-double buffered
case due to the weird behaviour of XClearArea in this case. However
this is undocumented, incompatible with what happens on double-buffered
drawing, and just not a good API. So, we drop this behaviour, having
fixed gtkclist.c which used this.
simply create a new cairo context for each expose event.
</para>
+ <para>
+ Due to a weird API in XClearArea the gdk_window_clear_area() call handled
+ a specified width or height of zero to mean "to end of window" for
+ non-doublebuffered drawing. This has been changed to be consistent with
+ the docs and what happens in the doublebuffered case. All code in gtk+
+ that relied on this has been fixed, but it is possible (although unlikely)
+ that third party applications rely on this. If you need to do this, just
+ implement it yourself using gdk_drawable_get_size().
+ </para>
+
</chapter>
gint height,
gboolean send_expose)
{
- GdkWindowObject *private = (GdkWindowObject *)window;
GdkRectangle rect;
GdkRegion *region;
if (GDK_WINDOW_DESTROYED (window))
return;
- /* This is what XClearArea does, and e.g. GtkCList uses it,
- so we need to duplicate that */
- if (width == 0)
- width = private->width - x;
- if (height == 0)
- height = private->height - y;
+ /* Terminate early to avoid weird interpretation of
+ zero width/height by XClearArea */
+ if (width == 0 || height == 0)
+ return;
rect.x = x;
rect.y = y;